[Data] 블로그 스크래핑 데이터 스팸 처리

블로그 스크래핑 데이터의 문제점

블로그 데이터를 스크래핑 하다보면 광고성 포스트들을 자주 목격할 수 있다. 예를 들어 서치에 쉽게 걸리도록 사람들이 자주 검색하는 키워드나 해시태그들을 여러가지 걸어놓는 것인데 키워드로 블로그 포스팅을 스크래핑 하다보면 관련성 없는 광고 목적의 포스트를 적재하게 될 수도 있다. 그렇다면 이런 문제를 어떻게 해결하면 좋을까? 차라리 비속어라면 특정 비속어 키워드를 저장해두고 필터링하는 로직을 추가하는 방식을 사용할 수 있지만 이런 광고성 포스팅에 추가하는 키워드들은 일반적인 키워드이기 때문에 함부로 특정 키워드를 배제해서 데이터를 수집할 수는 없다.

데이터 전처리 방안

연속적인 명사 단어 반복

일반적인 문장이라면 명사 동사 형용사 등의 다양한 품사로 이루어져 있겠지만 이런 홍보성 키워드의 나열은 명사로만 이루어져 있다. 예를 들어 일반적인 문장일 때는 ‘오늘 강아지 산책을 나갔는데 날씨가 너무 좋아서 행복했어요’라는 문장을 한국어 자연어처리 라이브러리인 KoNLPy로 품사태깅을 한다면 아래와 같이 나올 것이다.

from konlpy.tag import Okt

okt = Okt()
text = "오늘 강아지 산책을 나갔는데 날씨가 너무 좋아서 행복했어요"
tagged = okt.pos(text)
print(tagged)
[('오늘', 'Noun'), ('강아지', 'Noun'), ('산책', 'Noun'), ('을', 'Josa'), ('나갔는데', 'Verb'), ('날씨', 'Noun'), ('가', 'Josa'), ('너무', 'Adverb'), ('좋아서', 'Adjective'), ('행복했어요', 'Adjective')]

명사, 조사, 동사, 형용사, 부사 등 다양한 품사로 문장이 이루어진 것을 확인할 수 있다.

하지만 서치 유도형 홍보성 키워드는 ‘강아지목줄 강아지사료 강아지인형 강아지수제간식 강아지껌 강아지유산균 강아지욕조 강아지울타리’ 이런 식으로 연속적으로 명사만이 반복되기 때문에 이런 패턴을 찾아주어 포스트를 필터링하도록 한다. 해당 키워드들을 똑같이 KoNLPy로 품사태깅을 하면 아래와 같이 나온다.

from konlpy.tag import Okt

okt = Okt()
text = "강아지목줄 강아지사료 강아지인형 강아지수제간식 강아지껌 강아지유산균 강아지욕조 강아지울타리"
tagged = okt.pos(text)
print(tagged)
[('강아지', 'Noun'), ('목줄', 'Noun'), ('강아지', 'Noun'), ('사료', 'Noun'), ('강아지', 'Noun'), ('인형', 'Noun'), ('강아지', 'Noun'), ('수제', 'Noun'), ('간식', 'Noun'), ('강아지', 'Noun'), ('껌', 'Noun'), ('강아지', 'Noun'), ('유산균', 'Noun'), ('강아지', 'Noun'), ('욕조', 'Noun'), ('강아지', 'Noun'), ('울타리', 'Noun')]

이런 식으로 대부분의 단어들이 명사로만 반복이 된다. 그렇기 때문에 명사가 수십개 이상 연속으로 반복되는 포스팅을 광고성 포스트로 인식하고 필터링하게 되면 수집하는 데이터의 관련성과 질이 향상된다.

from konlpy.tag import Okt

def remove_text_with_consecutive_nouns(text):
    okt = Okt()

    # 텍스트를 단어로 토큰화하고 품사 태깅
    tagged = okt.pos(text)

    # 연속된 명사의 최대 개수 계산
    max_consecutive_nouns = 0
    current_consecutive_nouns = 0

    for word, pos in tagged:
        if pos == 'Noun':
            current_consecutive_nouns += 1
            max_consecutive_nouns = max(max_consecutive_nouns, current_consecutive_nouns)
        else:
            current_consecutive_nouns = 0

    # 연속된 명사가 30개 이상이면 None 반환하고 아니면 원본 텍스트 반환
    return None if max_consecutive_nouns >= 30 else text

첫번째 포스트는 일반적인 블로그 포스트이다.

image

위에 생성해둔 필터링 함수를 적용했을때 포스트 내용이 그대로 나오는 것을 볼 수 있다.

image

두번째 포스트는 광고성 블로그 포스트이다.

image

똑같이 필터링 함수를 적용했을때 명사가 30개 이상 반복되는 구간이 있으므로 None이 반환된다.

image

이런 필터링 팁을 사용해서 광고성 데이터를 필터링하면 추후 연관 감성어 분석이나 긍부정 분석을 할 때 보다 명확한 분석을 할 수 있고 특정 키워드에 대한 실질적인 사람들의 의견이나 행동 패턴을 더 잘 반영할 수 있다.

Categories:

Updated:

Leave a comment